#ifndef arbreUCTH
#define arbreUCTH

#include "../all2.h"
#include "noeudUCT.h"
#include "vecteurRave.h"
#include <pthread.h>
#include <gmpxx.h>

struct pieceNotee{
	Po piece;
	double note;
};


class arbreUCT
{
      private:
	//ratio
	int nbrPassages ;
	int nbrPiecesPosees ;

    int etage;

    int cptTemp;

	// Liste Chainee pour nous aider a choisir les noeuds
	vector<vector<vecteurRave> > * listeChainee;

	vector<vector<vecteurRave> > * listeCustom;


	//goban
    EPlateau * pInit;
    EPlateau * pActuel;

	noeudUCT * lastNoeud ; 	// le noeud courant
	Coup lastCoup;		// coup joué sur ce noeud
	noeudUCT * firstNoeud ; // le tout premier noeud

    char mode;

  //  char couleur; //couleur joué par UCT.

    int nbNoeud;

	vector<pthread_mutex_t> * tableMutex;
    vector<pthread_mutex_t> * Mutex;

    std::ofstream * fichierlogthread;
    std::ofstream * fichierlogthread2;

    vector <int> tableScore;
    vector <int> tableMoyeneScore;
    vector <int> tableMoyeneMin;
    vector <int> tableMoyeneMax;
    int nbMeilleurScore;

    public:
//	arbreUCT();
	arbreUCT(EPlateau * plateau, vector<pthread_mutex_t> * tableMutex, vector<pthread_mutex_t> * Mut, vector<vector<vecteurRave> > * lC);
	// ACCESSEURS
	noeudUCT * getNoeudRacine() ;
	void setNoeudRacine(noeudUCT * newRacine) ;

    vector<vector<vecteurRave> > * getlisteChainee();
	vector<vector<vecteurRave> > * getlisteCustom();

    void setlisteChainee(vector<vector<vecteurRave> > *  maliste);
	void setlisteCustom(vector<vector<vecteurRave> > * maliste);


	// METHODES
	//retourne le ratio nombre de passages tentes / nombre de victoires
	double * getRatio() ;

    Coup meilleurFils();
	// retourne le coup qu'il va falloir jouer
	Coup trouverProchainCoup(int nbRepet) ; //nbRepet = nombre de dessente à faire. // Pas implementé.
    bool dessente(); //fait une dessente, puis une remonté, renvoie true si ordi gagne, false sinon.
    bool noeudSuivant(); //choisit le noeud sur lequel on dessend, et y dessendre. (MAJ de Goban ect...) renvoi true si il dessend, false si le noeud lastNoeud est en bas.
    bool noeudSuivant2(); // Obselete, utiliser noeudSuivant!
    bool allerA(Coup c); //Ajoute c sur le GobanInit, dessend sur FirstNoeud et repart de ce Goban. /!\ Pas de tests : penser à toujorus donner un vrai noeud.

	//bool isFinie();

	void traceFils(int nb); //rempli un ficheir log avec els fils existants et lerus ratios, ainsi que le nb total de noeuds.

    bool dessente2();
    bool dessente2(int nbd);
    void traceRave();
   // void trickRave(Coup c, int ratio); //peut modifier une case d'une liste chainée avec une valeur donnée.
    void majtable(vector<vector <double> > * table); //maj la table avec les poids donnés par la formule de meilleur fils, pour que IA puisse tenir comtpe d'UCT ds son choix et l'integrant à d'autre parametres.



};



#endif
